home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 141 / Gekkan Dennou Club - 2000.2 Vol. 141 (Japan) (Track 1).bin / docs / asm / rasdown2.s < prev    next >
Encoding:
Text File  |  2000-01-10  |  2.7 KB  |  108 lines

  1. ;----------------------------------------------------------------
  2. ;低速スムーススクロールダウン
  3. ;    テキストの上から32行を4ドットずつスムーススクロールダウンします
  4. ;    ラスタブロックコピーの順序を考慮しています
  5. ;    ESCで終了します
  6.  
  7.     .include    doscall.mac
  8.     .include    iocscall.mac
  9.  
  10. ;----------------------------------------------------------------
  11. ;ラスタコピーマクロ
  12. ;<an.l:$00E88001に固定してあるアドレスレジスタ
  13. ;<dn.w:ソースラスタブロック番号*$0100+デスティネーションラスタブロック番号が
  14. ;    入っているレジスタ
  15. ;<sn.w:srを保存してあるレジスタ
  16. RASCPY    .macro    an,dn,sn
  17. @_1:    tst.b    (a0)            ;水平帰線期間を待つ
  18.     bmi    @_1
  19.     ori.w    #$0700,sr        ;割り込み禁止
  20. @_2:    tst.b    (a0)            ;水平表示期間を待つ
  21.     bpl    @_2
  22.     move.w    dn,($00E8002C-$00E88001,an)    ;ラスタブロック番号を設定
  23.     move.w    #8,($00E80480-$00E88001,an)    ;ラスタコピー実行
  24.     move.w    sn,sr            ;割り込み許可
  25.     .endm
  26.  
  27. ;----------------------------------------------------------------
  28. ;ラスタコピー終了マクロ
  29. ;<an.l:$00E88001に固定してあるアドレスレジスタ
  30. RASEND    .macro    an
  31. @_1:    tst.b    (a0)            ;水平帰線期間を待つ
  32.     bmi    @_1
  33. @_2:    tst.b    (a0)            ;水平表示期間を待つ
  34.     bpl    @_2
  35.     move.w    #$0000,($00E80480-$00E88001,a0)    ;ラスタコピー終了(clrは避ける)
  36.     .endm
  37.  
  38. ;----------------------------------------------------------------
  39. ;次の垂直帰線期間を待つマクロ
  40. ;<an.l:$00E88001に固定してあるアドレスレジスタ
  41. VSYNC    .macro    an
  42. @_1:    btst.b    #4,(a0)            ;垂直表示期間を待つ
  43.     beq    @_1
  44. @_2:    btst.b    #4,(a0)            ;垂直帰線期間を待つ
  45.     bne    @_2
  46.     .endm
  47.  
  48. ;----------------------------------------------------------------
  49. ;----------------------------------------------------------------
  50. ;メインルーチン
  51.  
  52. ;スーパーバイザモードへ移行
  53.     clr.l    -(sp)
  54.     DOS    _SUPER
  55.     move.l    d0,(sp)
  56.  
  57. ;カーソル消去
  58.     IOCS    _B_CUROFF
  59.  
  60.     move.w    $00E8002A,-(sp)
  61.  
  62. ;1ラスタブロックずつスクロールダウン(ちゃんとやる)
  63.     lea.l    $00E88001,a0        ;$00E88001に固定
  64.     move.w    #$0001,d6        ;定数
  65.     move.w    #$0100,d7        ;定数
  66.     move.w    #%0011,($00E8002A-$00E88001,a0)    ;ラスタコピープレーンセレクト
  67.     move.w    sr,d3            ;srを保存
  68. loop:
  69.     VSYNC    a0            ;次の垂直帰線期間を待つ
  70.     move.w    #$0080,d0        ;ラスタブロック0→128
  71.     RASCPY    a0,d0,d3
  72.     move.w    #$7F00,d0        ;ラスタブロック127→0
  73.     RASCPY    a0,d0,d3
  74.     move.w    #$0181,d4
  75.     move.w    #$8001,d5
  76.     moveq.l    #127-1,d1
  77. 1:    move.w    d4,d0            ;ラスタブロック1→129,2→128,3→129,…,127→129
  78.     RASCPY    a0,d0,d3
  79.     move.w    d5,d0            ;ラスタブロック128→1,129→2,128→3,…,128→127
  80.     RASCPY    a0,d0,d3
  81.     add.w    d7,d4
  82.     eor.w    d6,d4
  83.     add.w    d6,d5
  84.     eor.w    d7,d5
  85.     dbra    d1,1b
  86.     RASEND    a0
  87.     btst.b    #1,$0800.w        ;ESCキーチェック
  88.     beq    loop
  89.  
  90.     move.w    (sp)+,$00E8002A
  91.  
  92. ;キーバッファフラッシュ
  93.     bra    2f
  94. 1:    IOCS    _B_KEYINP
  95. 2:    IOCS    _B_KEYSNS
  96.     tst.l    d0
  97.     bne    1b
  98.  
  99. ;カーソル表示
  100.     IOCS    _B_CURON
  101.  
  102. ;ユーザモードに復帰
  103.     DOS    _SUPER
  104.     addq.l    #4,sp
  105.  
  106. ;終了
  107.     DOS    _EXIT
  108.